[小ネタ] AWS CLI の結果を読み取り専用の変数に代入しつつ、リターンコードも取得する方法

[小ネタ] AWS CLI の結果を読み取り専用の変数に代入しつつ、リターンコードも取得する方法

Clock Icon2022.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

アノテーションの荒川です。7 月から AWS 構築業務を担当しています。

AWS CLI を使ったオペレーションを Bash のシェルスクリプトにする機会があり、コマンドのリターンコードによって処理を分岐させようと考えました。

リターンコードを使った分岐処理は、AWS ドキュメントを参考に作りました。

いざ実行してみるとreadonlylocal -rを付けた変数に格納したときだけ、期待する動作となりませんでした。

問題のあるコード

以下のようなコードで、問題が発生しました。

readonly PARAM_VALUE=`aws ssm get-parameter \
    --region ${REGION} \
    --output text \
    --name ${PARAM_KEY} \
    --query "Parameter.Value" \
    2> /dev/null`

if [ $? -eq 0 ]; then
    # パラメータの取得に成功
    echo "Parameter Key: ${PARAM_KEY}"
    echo "Parameter Value: ${PARAM_VALUE}"
else
    # パラメータの取得に失敗
    echo "Failed to get Parameter Key: ${PARAM_KEY} in ${REGION}."
fi

この場合、リターンコードの$?は常に 0(成功)となり、パラメータの取得が成功した処理へと進みます。readonlyを消せば期待通りに動作しますが、SSM パラメータストアから取得した値は変更できなくしたいです。

期待する動作となるコード

以下のようなコードに修正することで、問題が回避できます。

readonly PARAM_VALUE=`aws ssm get-parameter \
    --region ${REGION} \
    --output text \
    --name ${PARAM_KEY} \
    --query "Parameter.Value" \
    2> /dev/null` return_code=$?

if [ ${return_code} -eq 0 ]; then
    echo "Parameter Key: ${PARAM_KEY}"
    echo "Parameter Value: ${PARAM_VALUE}"
# 分岐条件を追加してリターンコードに応じた処理が可能
else
    echo "Failed to get Parameter Key: ${PARAM_KEY} in ${REGION}."
fi

PARAM_VALUEだけではなくreturn_codeも readonly(再代入不可)となりますが、期待したリターンコードが得られます。

readonlyコマンドをリターンコード取得後に実行することでも、期待する動作となります。

PARAM_VALUE=`aws ssm get-parameter \
    --region ${REGION} \
    --output text \
    --name ${PARAM_KEY} \
    --query "Parameter.Value" \
    2> /dev/null`
return_code=$?
readonly PARAM_VALUE

if [ ${return_code} -eq 0 ]; then
    echo "Parameter Key: ${PARAM_KEY}"
    echo "Parameter Value: ${PARAM_VALUE}"
# 分岐条件を追加してリターンコードに応じた処理が可能
else
    echo "Failed to get Parameter Key: ${PARAM_KEY} in ${REGION}."
fi

おわりに

問題の原因は Bash のreadonlyを他言語のアクセス修飾子のような感覚で使っていたためでした。

readonlylocal -rコマンドですので、実行に成功すればリターンコード 0(成功)が返され、直前に実行された AWS CLI のリターンコードが上書きされます。

問題の一時しのぎとして、パラメータストアから取得した文字列長が 0 かチェックする方法もありますが、リターンコードに応じた分岐処理が行えなくなるため、オススメできません。

同じような事象に遭遇した方の参考になれば幸いです。

参考

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、さまざまな背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.